/**
 *
 * @param {Element} elementInstance - 目标元素实例
 *
 * @description 该函数首先检查当前是否处于全屏模式。如果是，它将退出全屏模式。否则，它将检查目标元素是否支持 requestFullscreenAPI。如果支持，它将调用该元素的 requestFullscreen 方法。
 *
 * @supportedBrowsers 该函数支持大多数现代浏览器，包括但不限于：
 * - Chrome，版本 5及以上
 * - Safari，版本 5.1及以上
 * - Firefox，版本 10及以上
 * - Opera，版本 12及以上
 * - Edge，版本 12及以上
 * - Internet Explorer，版本 11及以上
 */
export function fullScreen(element) {
  if (document.fullscreenElement) {
    document.exitFullscreen()
  } else if (element.requestFullscreen) {
    element.requestFullscreen()
  } else if (element.mozRequestFullScreen) {
    // Firefox
    element.mozRequestFullScreen()
  } else if (element.webkitRequestFullscreen) {
    // Chrome, Safari, Opera
    element.webkitRequestFullscreen()
  } else if (element.msRequestFullscreen) {
    // IE/Edge
    element.msRequestFullscreen()
  }
}

/**
 * 根据给定比例和长度计算对应的另一边的长度。
 * @param {string} ratio - 比例，格式为 '宽度/高度' 或 '高度/宽度'。
 * @param {number} length - 已知的长度（宽度或高度）。
 * @param {string} lengthType - 已知长度的类型，'width' 表示已知的是宽度，'height' 表示已知的是高度。
 * @returns {number} - 计算得到的另一边的长度。
 */
export function calculateDimension(ratio, length, lengthType) {
  // 解析比例
  const [numerator, denominator] = ratio.split('/').map(Number)
  if (isNaN(numerator) || isNaN(denominator)) {
    throw new Error('无效的比率格式')
  }

  // 判断已知的长度是宽度还是高度
  if (lengthType === 'width') {
    // 已知宽度，求高度
    return (length * denominator) / numerator
  } else if (lengthType === 'height') {
    // 已知高度，求宽度
    return (length * numerator) / denominator
  } else {
    throw new Error('无效长度类型. 使用 "width" 或 "height".')
  }
}

/**
 * 下载图片的异步函数
 * 如果是 macOS 系统，则在新标签页中打开图片，否则下载图片
 * @param {string} url - 要下载的图片的URL
 * @throws {Error} 如果下载过程中发生错误，则抛出错误
 */
export async function downloadImage(url) {
  try {
    // 检测是否是 macOS
    const isMacOS = /Macintosh|MacIntel|MacPPC|Mac68K/.test(navigator.userAgent)

    // 如果是 macOS，尝试在新标签页中打开图片
    if (isMacOS) {
      const newTab = window.open(url, '_blank')
      // 标签页成功打开，用户可以手动下载
      newTab && newTab.focus()
    } else {
      const filename = extractFileName(url)
      let link = document.createElement('a')
      link.href = url
      link.setAttribute('download', filename)
      document.body.appendChild(link)
      link.click()
    }
  } catch (error) {
    console.error(`Error downloading image: ${error}`)
  }
}

/**
 * 从 URL 中提取文件名
 * @param {string} url - 图片的URL
 * @returns {string} 文件名
 */
export function extractFileName(url) {
  return url.split('/').pop().split(/[?#]/)[0]
}

import axios from 'axios'

/**
 * 发送 post 请求下载文件，文件返回的为blob流
 * @param {*} url    接口地址
 * @param {*} data   请求参数
 * @param {*} fileName 文件名
 */

export async function fileDownload(url, data) {
  try {
    await axios({
      url: url,
      method: 'post',
      data: JSON.stringify(data),
      responseType: 'blob', //指定blob
      headers: {
        'Content-Type': 'application/json;'
      }
    }).then((res) => {
      const content = res.data
      const contentType = res.headers['content-type'] || 'application/octet-stream' //解决兼容性
      const blob = new Blob([content], { type: contentType })
      let fileName
      const contentDisposition = res.headers['content-disposition']

      if (contentDisposition && contentDisposition.indexOf('attachment') !== -1) {
        const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition)
        if (matches != null && matches[1]) {
          fileName = matches[1].replace(/['"]/g, '') // 去除文件名两端的引号
        }
      }

      if (!fileName) {
        fileName = extractFileName(url)
      }

      if ('download' in document.createElement('a')) {
        //非ie
        const fileLink = document.createElement('a')
        fileLink.download = fileName
        fileLink.style.display = 'none'
        fileLink.href = URL.createObjectURL(blob)
        document.body.appendChild(fileLink)
        fileLink.click()
        URL.revokeObjectURL(fileLink.href) // 释放url对象
        document.body.removeChild(fileLink)
      } else {
        navigator.msSaveBlob(blob, fileName)
      }
    })
  } catch (e) {
    console.log(e)
  }
}
